#ifndef __TASK_H
#define __TASK_H

#include "list.h"
#include "projdefs.h"
#include "portmacro.h"
#include "FreeRTOSConfig.h"

/*
*************************************************************************
*                               宏定义
*************************************************************************
*/

/* 空闲任务优先级最低 */
#define tskIDLE_PRIORITY  ( ( UBaseType_t ) 0U )

/*
*************************************************************************
*                               类型定义
*************************************************************************
*/

typedef struct tskTaskControlBlock
{
	volatile StackType_t *pxTopOfStack;                          /* 栈顶指针 */
	ListItem_t           xStateListItem;                         /* 任务钩子节点, 能形成链表的关键 */
	StackType_t          *pxStack;                               /* 任务栈起始地址 */
	char                 pcTaskName[ configMAX_TASK_NAME_LEN ];  /* 任务名称，字符串形式 */
	TickType_t           xTicksToDelay;                          /* 延时时间 */
	UBaseType_t          uxPriority;                             /* 任务优先级, 越大则代表其优先级越高 */
}tskTCB;

typedef tskTCB TCB_t;

/* 任务句柄 */
typedef void * TaskHandle_t;

/* 主动任务切换 */
#define     taskYIELD()     portYIELD() 

/*
*************************************************************************
*                               宏函数
*************************************************************************
*/

/* 进入临界区  */
#define taskENTER_CRITICAL()  portENTER_CRITICAL()
#define taskENTER_CRITICAL_FROM_ISR() portSET_INTERRUPT_MASK_FROM_ISR()

/* 退出临界区 */
#define taskEXIT_CRITICAL()  portEXIT_CRITICAL()
#define taskEXIT_CRITICAL_FROM_ISR( x ) portCLEAR_INTERRUPT_MASK_FROM_ISR( x )

/*
*************************************************************************
*                               extern 函数
*************************************************************************
*/

extern void vTaskStartScheduler( void );
extern void prvInitialiseTaskLists( void );
extern BaseType_t xPortStartScheduler( void );
extern StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters);
extern TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,            /* 任务入口，即任务的函数名称 */
																			 const char * const pcName,            /* 任务名称, 字符串形式 */
																			 const uint32_t ulStackDepth,          /* 任务栈大小, 单位为字 */
																			 void * const pvParameters,            /* 任务形参 */
																			 UBaseType_t uxPriority,               /* 任务优先级, 数字越大, 优先级越高*/
																			 StackType_t * const puxStackBuffer,   /* 任务栈起始地址 */
																			 TCB_t * const pxTaskBuffer);          /* 任务控制块指针。 */
void vTaskDelay( const TickType_t xTicksToDelay );
void xTaskIncrementTick( void );
void vTaskSwitchContext( void );
																			 
// 获取空闲任务的栈信息																		 
void vApplicationGetIdleTaskMemory( TCB_t **ppxIdleTaskTCBBuffer,
                                    StackType_t **ppxIdleTaskStackBuffer,
                                    uint32_t *pulIdleTaskStackSize );

/*
*************************************************************************
*                               extern 变量
*************************************************************************
*/
extern List_t pxReadyTasksLists[ configMAX_PRIORITIES ];
extern TCB_t * volatile pxCurrentTCB;
extern TCB_t Task1TCB;
extern TCB_t Task2TCB;
extern TCB_t IdleTaskTCB;																			 
																			 
#endif
